# -*- coding: utf-8 *-*

#   This file is part of Sql-Rice.
#
#    Sql-Rice is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 3 of the License, or
#    (at your option) any later version.
#
#    Sql-Rice is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with Sql-Rice; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
from utils.common_lambda import do_nothing


class MissingArgException(Exception):
    pass


class MethodWraper(object):

    def __init__(self, func, valide=None, do_with=do_nothing, factory=None):
        self._func = func
        self._valide = valide if valide else {}
        self._do_with = do_with
        self._factory = factory

    def valide(self, args, kwargs):
        for name, func in self._valide.items():
            try:
                if not func(kwargs[name]):
                    return False
            except KeyError:
                raise MissingArgException(name)
        return True

    def __call__(self, *args, **kwargs):
        if args or kwargs:
            if self.valide(args, kwargs):
                values = self._func(*args, **kwargs)

            else:
                raise ValueError('Args not passed validation')
        else:
            kparams = self._factory() if self._factory else ((), {})
            values = self._func(**kparams)
        self._do_with(values)
